//g++ cJSON.c parse.c -o 2  -lm
//------cJSON 测试例程----------------


#include <stdio.h>
#include "cJSON.h"

char json_string[]="{\"name\":\"MQ\",\"age\":25,\"height\":183.5,\"gender\":false,\
						\"address\":{\"country\":\"China\",\"zip-code\":123456},\
						\"subject\":[\"政治\",\"数学\",\"英语\",\"专业课\"],\
						\"time\":[123,456,789,150],\"grade\":[66.51,118.52,61.53,128.54],\
							\"student\":[{\"name\":\"张三\",\"age\":24,\"gender\":false},\
										{\"name\":\"李四\",\"age\":25,\"gender\":true},\
										{\"name\":\"王五\",\"age\":26,\"gender\":null}]}";//1 定义JSON字符串	
cJSON* cjson;


void json2()
{
	//cJSON* cjson = cJSON_Parse(json_string);//将JSON字符串转换成JSON结构体
	/*
	if(cjson == NULL)						//判断转换是否成功
	{
		printf("cjson error...\r\n");
	}
	else
	{
		printf("%s\n",cJSON_Print(cjson));//打包成功调用cJSON_Print打印输出
	}
	*/
	/*********************以下就是提取的数据**********************/
	char *name = cJSON_GetObjectItem(cjson,"name")->valuestring;	//解析字符串
	printf("%s\n",name);//MQ

	int age = cJSON_GetObjectItem(cjson,"age")->valueint;	//解析整型
	printf("%d\n",age);//25

	double height = cJSON_GetObjectItem(cjson,"height")->valuedouble;	//解析双浮点型
	printf("%.1f\n",height);//183.5
	
	int gender = cJSON_GetObjectItem(cjson,"gender")->type; 	//解析逻辑值---输出逻辑值对应的宏定义数值
	printf("%d\n",gender);//0
	
	cJSON* ADD = cJSON_GetObjectItem(cjson,"address");	//解析对象
	char * country = cJSON_GetObjectItem(ADD,"country")->valuestring;	//解析对象中的字符串
	printf("%s\n",country);//China
	int zip = cJSON_GetObjectItem(ADD,"zip-code")->valueint;	//解析对象中的整型数字
	printf("%d\n",zip);//123456
	
	cJSON* SUB = cJSON_GetObjectItem(cjson,"subject");	//解析数组
	int SUB_size = cJSON_GetArraySize(SUB);	//获取数组成员个数 
	int i=0;
	for(i=0;i<SUB_size;i++)
		printf("%s ",cJSON_GetArrayItem(SUB,i)->valuestring);//解析数组中的字符串
	printf("\n");//政治 数学 英语 专业课

	cJSON* TIM = cJSON_GetObjectItem(cjson,"time");	//解析数组
	int TIM_size = cJSON_GetArraySize(TIM);//获取数组成员个数 
	for(i=0;i<TIM_size;i++)
		printf("%d ",cJSON_GetArrayItem(TIM,i)->valueint);//解析数组中的整型数字
	printf("\n");//123 456 789 150

	cJSON* GRA = cJSON_GetObjectItem(cjson,"grade");//解析数组
	int GRA_size = cJSON_GetArraySize(GRA);	//获取数组成员个数 
	for(i=0;i<GRA_size;i++)
		printf("%f ",cJSON_GetArrayItem(GRA,i)->valuedouble);//解析数组中的浮点型数字
	printf("\n");//66.510000 118.520000 61.530000 128.540000	
	
	cJSON* STU = cJSON_GetObjectItem(cjson,"student");//解析数组
	int STU_size = cJSON_GetArraySize(STU);//获取数组成员个数
	cJSON* STU_item = STU->child;//获取子对象
	for(i=0;i<STU_size;i++) 
	{
		printf("%s ",cJSON_GetObjectItem(STU_item,"name")->valuestring);//解析数组中对象中的字符串
		printf("%d ",cJSON_GetObjectItem(STU_item,"age")->valueint);//解析数组中对象中的整型数字
		printf("%d\n",cJSON_GetObjectItem(STU_item,"gender")->type);//解析数组中对象中的逻辑值---输出逻辑值对应的宏定义数值
		STU_item = STU_item->next;	//跳转到下一个对象中
	}//张三 24 0//李四 25 1//王五 26 2
	
	cJSON_Delete(cjson);//清除结构体 
}
/*
int main()
{
	cjson = cJSON_Parse(json_string);//2 将JSON字符串转换成JSON结构体
	//json2();

	//int age = cJSON_GetObjectItem(cjson,"age")->valueint;	//3 解析整型
	//printf("%d\n",age);//25



	cJSON* ADD = cJSON_GetObjectItem(cjson,"address");	//解析对象
	char * country = cJSON_GetObjectItem(ADD,"country")->valuestring;	//解析对象中的字符串
	printf("%s\n",country);//China
	//int zip = cJSON_GetObjectItem(ADD,"zip-code")->valueint;	//解析对象中的整型数字
	//printf("%d\n",zip);//123456





	return 0;
}
*/
/*
{
	"name":	"MQ",												//MQ
	"age":	25,													//25
	"height":	183.500000,										//183.5
	"gender":	false,											//0
	"address":	{
		"country":	"China",									//China
		"zip-code":	123456										//123456
	},
	"subject":	["政治", "数学", "英语", "专业课"],					//政治 数学 英语 专业课 
	"time":	[123, 456, 789, 150],								//123 456 789 150
	"grade":	[66.510000, 118.520000, 61.530000, 128.540000],	//66.510000 118.520000 61.530000 128.540000
	"student":	[{
			"name":	"张三",										//张三 24 0
			"age":	24,
			"gender":	false
		}, {
			"name":	"李四",										//李四 25 1
			"age":	25,
			"gender":	true
		}, {
			"name":	"王五",										//王五 26 2
			"age":	26,
			"gender":	null
		}]
}
*/
